#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
struct car
{
    int v,a,d;
    double l,r;
    bool lo;
};
struct ces
{
    int whe;
    vector<int> cen;
};
bool cmp(ces a,ces b)
{
    return a.cen.size() < b.cen.size();
}
int main()
{
    freopen("detect.in","r",stdin);
    freopen("detect.out","w",stdout);
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    int t;cin>>t;
    while(t--)
    {
        int n,m,L,V;
        cin>>n>>m>>L>>V;
        vector<car> cars;
        for(int i=0;i<n;i++)
        {
            car jn;
            cin>>jn.d>>jn.v>>jn.a;
            if(jn.v > V)
            {
                jn.lo = false;
                jn.l = jn.d;
                if(jn.a < 0)
                    jn.r = min((V*V-jn.v*jn.v)/(2*jn.a)+jn.d,L);
                else
                    jn.r = L+1;
            }
            else
            {
                jn.lo = true;
                if(jn.a > 0)
                {
                    jn.l = (V*V-jn.v*jn.v)/(2*jn.a)+jn.d;
                    jn.r = L+1;
                }
                else
                {
                    jn.l = 0;
                    jn.r = -1;
                }
            }
            cars.push_back(jn);
        }
        vector<ces> ce;
        vector<vector<int> > carced;
        carced.resize(n);
        for(int i=0;i<m;i++)
        {
            int x;cin>>x;
            ce.push_back({x});
            for(int j=0;j<n;j++)
                if((cars[j].l < x || (!cars[j].lo && cars[j].l == x)) && cars[j].r > x)
                {
                    carced[j].push_back(x);
                    ce[i].cen.push_back(j);
                }
        }
        for(int i=0;i<carced.size();)
            if(carced[i].size() == 0)
                carced.erase(carced.begin()+i);
            else i++;
        cout<<carced.size()<<" ";
        sort(ce.begin(),ce.end(),cmp);
        int cnt = 0;
        for(int i=0;i<ce.size();)
        {
            bool del = true;
            for(int j=0;j<carced.size();j++)
                if(carced[j].size() == 1 && carced[j][0] == ce[i].whe)
                {
                    del = false;
                    break;
                }
            cnt += del;
            if(del){
                for(int j=0;j<n;j++)
                {
                    int l = -1;
                    int r = carced[j].size();
                    while(l < r-1)
                    {
                        int mid = (l+r)>>1;
                        if(carced[j][mid] == ce[i].whe){
                            carced[j].erase(carced[j].begin()+mid);
                            break;
                        }
                        else if(carced[j][mid] > ce[i].whe) r = mid;
                        else l = mid;
                    }
                }
                ce.erase(ce.begin()+i);
            }
            else i++;
        }
        cout<<cnt<<"\n";
    }
    return 0;
}
